home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CTRLBA.PAK / MAINFRM.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  13KB  |  453 lines

  1. // mainfrm.cpp : implementation of the CMainFrame class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "ctrlbars.h"
  15.  
  16. #include "mainfrm.h"
  17.  
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char BASED_CODE THIS_FILE[] = __FILE__;
  21. #endif
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CMainFrame
  25.  
  26. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  27.     //{{AFX_MSG_MAP(CMainFrame)
  28.     ON_WM_CREATE()
  29.     ON_COMMAND(ID_VIEW_DLGBARTOP, OnViewDlgbarTop)
  30.     ON_UPDATE_COMMAND_UI(ID_VIEW_DLGBARTOP, OnUpdateViewDlgbartop)
  31.     ON_COMMAND(ID_VIEW_SHORT, OnViewShort)
  32.     ON_COMMAND(ID_VIEW_LONG, OnViewLong)
  33.     ON_COMMAND(ID_TOGGLE_INSERT, OnToggleInsert)
  34.     ON_UPDATE_COMMAND_UI(ID_INDICATOR_OVR, OnUpdateInsert)
  35.     ON_COMMAND_EX(IDW_STYLES, OnViewBar)
  36.     ON_UPDATE_COMMAND_UI(IDW_STYLES, OnUpdateBarMenu)
  37.     ON_COMMAND(IDM_VIEWPALETTE, OnViewPalette)
  38.     ON_UPDATE_COMMAND_UI(IDM_VIEWPALETTE, OnUpdatePaletteMenu)
  39.     ON_COMMAND(IDM_PALETTE_2COLUMN, OnPalette2column)
  40.     ON_COMMAND(IDM_PALETTE_3COLUMN, OnPalette3column)
  41.     ON_UPDATE_COMMAND_UI(IDM_PALETTE_3COLUMN, OnUpdatePalette3column)
  42.     ON_UPDATE_COMMAND_UI(IDM_PALETTE_2COLUMN, OnUpdatePalette2column)
  43.     ON_CBN_SELCHANGE(IDC_PALETTE, OnSelChangePalette)
  44.     //}}AFX_MSG_MAP
  45.     ON_COMMAND_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnChangeStyle)
  46.     ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnUpdateStyle)
  47.     ON_COMMAND_RANGE(ID_PALETTEERASE, ID_PALETTEOVAL, OnPalette)
  48.     ON_UPDATE_COMMAND_UI_RANGE(ID_PALETTEERASE, ID_PALETTEOVAL, OnUpdatePalette)
  49. END_MESSAGE_MAP()
  50.  
  51. /////////////////////////////////////////////////////////////////////////////
  52. // arrays of IDs used to initialize control bars
  53.  
  54. static UINT BASED_CODE styles[] =
  55. {
  56.     // same order as in the bitmap 'styles.bmp'
  57.     ID_SEPARATOR,           // for combo box (placeholder)
  58.     ID_SEPARATOR,
  59.     ID_STYLE_LEFT,
  60.     ID_STYLE_CENTERED,
  61.     ID_STYLE_RIGHT,
  62.     ID_STYLE_JUSTIFIED,
  63. };
  64.  
  65. static UINT BASED_CODE palette[] =
  66. {
  67.     // same order as in the bitmap 'palette.bmp'
  68.     ID_PALETTEERASE,
  69.     ID_PALETTEPEN,
  70.     ID_PALETTESELECT,
  71.     ID_PALETTEBRUSH,
  72.     ID_PALETTESPRAY,
  73.     ID_PALETTEPAINT,
  74.     ID_PALETTELINE,
  75.     ID_PALETTEEYEDROP,
  76.     ID_PALETTEMAG,
  77.     ID_PALETTERECT,
  78.     ID_PALETTEROUND,
  79.     ID_PALETTEOVAL
  80. };
  81.  
  82. static UINT BASED_CODE indicators[] =
  83. {
  84.     ID_SEPARATOR,           // status line indicator
  85.     ID_INDICATOR_OVR,
  86.     ID_INDICATOR_CAPS,
  87.     ID_INDICATOR_NUM
  88. };
  89.  
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CMainFrame construction/destruction
  92.  
  93. CMainFrame::CMainFrame()
  94. {
  95.     m_bInsert = FALSE;      // default to over-strke mode
  96.     m_bDialogTop = FALSE;
  97.     m_nPaletteCol = 3;
  98. }
  99.  
  100. CMainFrame::~CMainFrame()
  101. {
  102. }
  103.  
  104. // We override PreCreateWindow to specify a different window class (WNDCLASS),
  105. //   one with a different background and without the CS_VREDRAW/CS_HREDRAW
  106. //   style so all the frame window's control bars will not be repainted
  107. //   when the window is resized.
  108. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  109. {
  110.     cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS,
  111.         AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)(COLOR_WINDOW+1),
  112.         AfxGetApp()->LoadIcon(IDR_MAINFRAME));
  113.  
  114.     return TRUE;
  115. }
  116.  
  117. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  118. {
  119.     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  120.         return -1;
  121.  
  122.     EnableDocking(CBRS_ALIGN_ANY);
  123.  
  124.     if (!CreateToolBar())
  125.         return -1;
  126.     if (!CreateStyleBar())
  127.         return -1;
  128.     if (!CreatePaletteBar())
  129.         return -1;
  130.     if (!CreateStatusBar())
  131.         return -1;
  132.  
  133.     if (!m_wndDlgBar.Create(this, IDD_VIEWSELECT,
  134.         CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY, IDD_VIEWSELECT))
  135.     {
  136.         TRACE0("Failed to create DlgBar\n");
  137.         return -1;      // fail to create
  138.     }
  139.  
  140.     return 0;
  141. }
  142.  
  143. BOOL CMainFrame::CreateToolBar()
  144. {
  145.     if (!m_wndToolBar.Create(this,
  146.             CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|WS_VISIBLE) ||
  147.         !m_wndToolBar.LoadBitmap(IDR_MAINFRAME))
  148.     {
  149.         TRACE0("Failed to create toolbar\n");
  150.         return FALSE;       // fail to create
  151.     }
  152.  
  153.     OnViewShort();
  154.     return TRUE;
  155. }
  156.  
  157. BOOL CMainFrame::CreatePaletteBar()
  158. {
  159.     if (!m_wndPaletteBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_FIXED |
  160.         CBRS_TOP | CBRS_TOOLTIPS, ID_PALETTEBAR) ||
  161.         !m_wndPaletteBar.LoadBitmap(IDB_PALETTE) ||
  162.         !m_wndPaletteBar.SetButtons(palette,
  163.           sizeof(palette)/sizeof(UINT)))
  164.     {
  165.         TRACE0("Failed to create toolbar\n");
  166.         return FALSE;       // fail to create
  167.     }
  168.     
  169.     m_wndPaletteBar.SetWindowText(_T("Palette"));
  170.     m_wndPaletteBar.EnableDocking(0);
  171.  
  172.     // Create the Palette.  We are using hardcoded numbers for ease here
  173.     // normally the location would be read in from an ini file.
  174.     CPoint pt(GetSystemMetrics(SM_CXSCREEN) - 100,
  175.         GetSystemMetrics(SM_CYSCREEN) / 3);
  176.  
  177.     m_wndPaletteBar.SetColumns(3);
  178.     FloatControlBar(&m_wndPaletteBar, pt);
  179.   
  180.     return TRUE;
  181. }
  182.  
  183. BOOL CMainFrame::CreateStyleBar()
  184. {
  185.     const int nDropHeight = 100;
  186.  
  187.     if (!m_wndStyleBar.Create(this, WS_CHILD|WS_VISIBLE|CBRS_TOP|
  188.             CBRS_TOOLTIPS|CBRS_FLYBY, IDW_STYLES) ||
  189.         !m_wndStyleBar.LoadBitmap(IDB_STYLES) ||
  190.         !m_wndStyleBar.SetButtons(styles, sizeof(styles)/sizeof(UINT)))
  191.     {
  192.         TRACE0("Failed to create stylebar\n");
  193.         return FALSE;       // fail to create
  194.     }
  195.  
  196.     // Create the combo box
  197.     m_wndStyleBar.SetButtonInfo(0, IDW_COMBO, TBBS_SEPARATOR, 100);
  198.  
  199.     // Design guide advises 12 pixel gap between combos and buttons
  200.     m_wndStyleBar.SetButtonInfo(1, ID_SEPARATOR, TBBS_SEPARATOR, 12);
  201.     CRect rect;
  202.     m_wndStyleBar.GetItemRect(0, &rect);
  203.     rect.top = 3;
  204.     rect.bottom = rect.top + nDropHeight;
  205.     if (!m_wndStyleBar.m_comboBox.Create(
  206.             CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP,
  207.             rect, &m_wndStyleBar, IDW_COMBO))
  208.     {
  209.         TRACE0("Failed to create combo-box\n");
  210.         return FALSE;
  211.     }
  212.  
  213.     //  Fill the combo box
  214.     CString szStyle;
  215.     if (szStyle.LoadString(IDS_LEFT))
  216.         m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  217.     if (szStyle.LoadString(IDS_CENTERED))
  218.         m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  219.     if (szStyle.LoadString(IDS_RIGHT))
  220.         m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  221.     if (szStyle.LoadString(IDS_JUSTIFIED))
  222.         m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
  223.  
  224.     //  Create a font for the combobox
  225.     LOGFONT logFont;
  226.     memset(&logFont, 0, sizeof(logFont));
  227.  
  228.     if (!::GetSystemMetrics(SM_DBCSENABLED))
  229.     {
  230.         // Since design guide says toolbars are fixed height so is the font.
  231. #ifndef _MAC
  232.         logFont.lfHeight = -12;
  233. #else
  234.         logFont.lfHeight = -14;     // looks better than 12 on Mac
  235. #endif
  236.         logFont.lfWeight = FW_BOLD;
  237.         logFont.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
  238.         CString strDefaultFont;
  239.         strDefaultFont.LoadString(IDS_DEFAULT_FONT);
  240.         lstrcpy(logFont.lfFaceName, strDefaultFont);
  241.         if (!m_wndStyleBar.m_font.CreateFontIndirect(&logFont))
  242.             TRACE0("Could Not create font for combo\n");
  243.         else
  244.             m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);
  245.     }
  246.     else
  247.     {
  248.         m_wndStyleBar.m_font.Attach(::GetStockObject(SYSTEM_FONT));
  249.         m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);
  250.     }
  251.  
  252.     return TRUE;
  253. }
  254.  
  255. BOOL CMainFrame::CreateStatusBar()
  256. {
  257.     if (!m_wndStatusBar.Create(this) ||
  258.         !m_wndStatusBar.SetIndicators(indicators,
  259.           sizeof(indicators)/sizeof(UINT)))
  260.     {
  261.         TRACE0("Failed to create status bar\n");
  262.         return FALSE;       // fail to create
  263.     }
  264.  
  265.     UINT nID, nStyle;
  266.     int cxWidth;
  267.  
  268.     m_wndStatusBar.GetPaneInfo( 0, nID, nStyle, cxWidth);
  269.     m_wndStatusBar.SetPaneInfo( 0, nID, SBPS_STRETCH|SBPS_NORMAL, cxWidth);
  270.     return TRUE;
  271. }
  272.  
  273. /////////////////////////////////////////////////////////////////////////////
  274. // CMainFrame diagnostics
  275.  
  276. #ifdef _DEBUG
  277. void CMainFrame::AssertValid() const
  278. {
  279.     CFrameWnd::AssertValid();
  280. }
  281.  
  282. void CMainFrame::Dump(CDumpContext& dc) const
  283. {
  284.     CFrameWnd::Dump(dc);
  285. }
  286.  
  287. #endif //_DEBUG
  288.  
  289. /////////////////////////////////////////////////////////////////////////////
  290. // CMainFrame message handlers
  291.  
  292. void CMainFrame::OnViewShort()
  293. {
  294.     // Set the toolbar to show only partial commmand list
  295.     m_wndToolBar.SetButtons(NULL, 7);
  296.     m_wndToolBar.SetButtonInfo(0, ID_VIEW_LONG,TBBS_BUTTON, 10);
  297.     m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  298.     m_wndToolBar.SetButtonInfo(2, ID_FILE_OPEN,TBBS_BUTTON, 1);
  299.     m_wndToolBar.SetButtonInfo(3, ID_FILE_NEW,TBBS_BUTTON, 0);
  300.     m_wndToolBar.SetButtonInfo(4, ID_FILE_SAVE,TBBS_BUTTON, 2);
  301.     m_wndToolBar.SetButtonInfo(5, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  302.     m_wndToolBar.SetButtonInfo(6, ID_APP_ABOUT,TBBS_BUTTON, 7);
  303.  
  304.     // invalidate the call update handlers before painting
  305.     m_wndToolBar.Invalidate();
  306.     AfxGetApp()->OnIdle(-1);
  307. }
  308.  
  309. void CMainFrame::OnViewLong()
  310. {
  311.     // Set the toolbar to show all commmands
  312.     m_wndToolBar.SetButtons(NULL, 13);
  313.     m_wndToolBar.SetButtonInfo(0, ID_VIEW_SHORT,TBBS_BUTTON, 9);
  314.     m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  315.     m_wndToolBar.SetButtonInfo(2, ID_FILE_OPEN,TBBS_BUTTON, 1);
  316.     m_wndToolBar.SetButtonInfo(3, ID_FILE_NEW,TBBS_BUTTON, 0);
  317.     m_wndToolBar.SetButtonInfo(4, ID_FILE_SAVE,TBBS_BUTTON, 2);
  318.     m_wndToolBar.SetButtonInfo(5, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  319.     m_wndToolBar.SetButtonInfo(6, ID_APP_ABOUT,TBBS_BUTTON, 7);
  320.     m_wndToolBar.SetButtonInfo(7, ID_SEPARATOR,TBBS_SEPARATOR, 6);
  321.     m_wndToolBar.SetButtonInfo(8, ID_EDIT_CUT,TBBS_BUTTON, 3);
  322.     m_wndToolBar.SetButtonInfo(9, ID_EDIT_COPY,TBBS_BUTTON, 4);
  323.     m_wndToolBar.SetButtonInfo(10, ID_EDIT_PASTE,TBBS_BUTTON, 5);
  324.     m_wndToolBar.SetButtonInfo(11, ID_FILE_PRINT,TBBS_BUTTON, 6);
  325.     m_wndToolBar.SetButtonInfo(12, ID_CONTEXT_HELP,TBBS_BUTTON, 8);
  326.  
  327.     // invalidate then call update handlers before painting
  328.     m_wndToolBar.Invalidate();
  329.     AfxGetApp()->OnIdle(-1);
  330. }
  331.  
  332. void CMainFrame::OnViewDlgbarTop()
  333. {
  334.     if (m_bDialogTop)
  335.         m_wndDlgBar.SetWindowPos(&m_wndStatusBar, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
  336.     else
  337.         m_wndDlgBar.SetWindowPos(&wndTop, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
  338.  
  339.     RecalcLayout();
  340.     m_bDialogTop = !m_bDialogTop;
  341. }
  342.  
  343. void CMainFrame::OnUpdateViewDlgbartop(CCmdUI* pCmdUI)
  344. {
  345.     pCmdUI->SetCheck(m_bDialogTop);
  346. }
  347.  
  348. BOOL CMainFrame::OnViewBar(UINT nID)
  349. {
  350.     CWnd* pBar;
  351.     if ((pBar = GetDlgItem(nID)) == NULL)
  352.         return FALSE;   // not for us
  353.     // toggle visible state
  354.     pBar->ShowWindow((pBar->GetStyle() & WS_VISIBLE) == 0);
  355.     RecalcLayout();
  356.     return TRUE;
  357. }
  358.  
  359. void CMainFrame::OnUpdateBarMenu(CCmdUI* pCmdUI)
  360. {
  361.     CWnd* pBar;
  362.     if ((pBar = GetDlgItem(pCmdUI->m_nID)) == NULL)
  363.     {
  364.         pCmdUI->ContinueRouting();
  365.         return; // not for us
  366.     }
  367.     pCmdUI->SetCheck((pBar->GetStyle() & WS_VISIBLE) != 0);
  368. }
  369.  
  370. void CMainFrame::OnViewPalette()
  371. {
  372.     BOOL bVisible = ((m_wndPaletteBar.GetStyle() & WS_VISIBLE) != 0);
  373.  
  374.     ShowControlBar(&m_wndPaletteBar, !bVisible, FALSE);
  375.     RecalcLayout();
  376. }
  377.  
  378. void CMainFrame::OnUpdatePaletteMenu(CCmdUI* pCmdUI)
  379. {
  380.     BOOL bVisible = ((m_wndPaletteBar.GetStyle() & WS_VISIBLE) != 0);
  381.     pCmdUI->SetCheck(bVisible);
  382. }
  383.  
  384. void CMainFrame::OnChangeStyle(UINT nID)
  385. {
  386.     m_wndStyleBar.m_comboBox.SetCurSel((int)(nID-ID_STYLE_BASE));
  387. }
  388.  
  389. void CMainFrame::OnUpdateStyle(CCmdUI* pCmdUI)
  390. {
  391.     UINT nIndex = m_wndStyleBar.m_comboBox.GetCurSel();
  392.     pCmdUI->SetCheck((UINT)(ID_STYLE_BASE+nIndex) == pCmdUI->m_nID);
  393. }
  394.  
  395. void CMainFrame::OnUpdateInsert(CCmdUI* pCmdUI)
  396. {
  397.     pCmdUI->Enable(!m_bInsert);
  398. }
  399.  
  400. void CMainFrame::OnToggleInsert()
  401. {
  402.     m_bInsert = !m_bInsert;
  403. }
  404.  
  405. void CMainFrame::OnUpdatePalette(CCmdUI* pCmdUI)
  406. {
  407.     CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  408.     UINT nIndex = pCBox->GetCurSel();
  409.     pCmdUI->SetCheck((UINT)(ID_PALETTE_BASE + nIndex) == pCmdUI->m_nID);
  410. }
  411.  
  412. void CMainFrame::OnPalette(UINT nID)
  413. {
  414.     CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  415.     pCBox->SetCurSel((int)(nID - ID_PALETTE_BASE));
  416.     OnSelChangePalette();
  417. }
  418.  
  419. void CMainFrame::OnSelChangePalette()
  420. {
  421.     CString strText;
  422.     CString strItem;
  423.     CComboBox* pCBox = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_PALETTE);
  424.     int nIndex = pCBox->GetCurSel();
  425.     if (nIndex == CB_ERR)
  426.         return;
  427.     pCBox->GetLBText(nIndex, strItem);
  428.     AfxFormatString1(strText, IDS_SELECTED_PROMPT, (LPCTSTR)strItem);
  429.     SetMessageText(strText);
  430. }
  431.  
  432. void CMainFrame::OnPalette2column()
  433. {
  434.     m_nPaletteCol = 2;
  435.     m_wndPaletteBar.SetColumns(m_nPaletteCol);
  436. }
  437.  
  438. void CMainFrame::OnPalette3column()
  439. {
  440.     m_nPaletteCol = 3;
  441.     m_wndPaletteBar.SetColumns(m_nPaletteCol);
  442. }
  443.  
  444. void CMainFrame::OnUpdatePalette2column(CCmdUI* pCmdUI)
  445. {
  446.     pCmdUI->SetCheck(m_nPaletteCol == 2);
  447. }
  448.  
  449. void CMainFrame::OnUpdatePalette3column(CCmdUI* pCmdUI)
  450. {
  451.     pCmdUI->SetCheck(m_nPaletteCol == 3);
  452. }
  453.